#python 最低适应版本 3.6
# 2023-06-07
#主分支:C光标控制
#更新:
import json
import os
from msvcrt import getwch as m #微软平台

g,g2,g3=0,0,0
while True:
    os.system("cls")
    print("方向键移动")
    if g==0:#退出
        print("<退出>\n文档\n表格")
        fla0=m()
        if fla0=="\r":
            break
        elif fla0=="\x00" and m()=="P":
            g=1
    elif g==1:#文档
        os.system("cls")
        print("路径:",os.getcwd(),"\n你的文件:")
        for i in os.listdir():
            if os.path.isfile(i):
                print("    ",i)
        fla1=m()
        if 'a'<=fla1<='z':
            print("<文档>(直接输入可创建):",fla1,end="")
            file=str(fla1)+input()
            if os.path.isfile(file):#如果存在,以读取形式打开
                with open(file,"r") as doc:
                    q=json.loads(doc.read())
            else:#如果不存在,创建但不写入
                open(file,"w").close()
                input("该文件不存在,已创建")
                q=[["table",["*"],[["*"]]]]#默认初始化
            g=2
        elif fla1=="\x00" and m()=="H":g=0
    elif g==2:#表格
        print(f"退出\n文档 {file}\n表格")
        for i in range(len(q)):
            if i==g2:
                print('<',q[i][0],'>',end="  ")
            else:
                print(q[i][0],end="  ")
        print("+\n 表头 数据 删除")
        fla2=m()
        if fla2=="\x00":
            mid=m()
            if mid=="H":
                g=1
                with open(file,"w+") as doc:
                    print(doc.write(json.dumps(q)))
            elif mid=="P":g=3
            elif mid=="K" and g2>0:g2-=1
            elif mid=="M" and g2<len(q):g2+=1
        if g2==len(q):
            q.append([input("添加表格:"),['*'],[['*']]])
    elif g==3:
        print(f"退出\n文档 {file}\n表格\n{q[g2][0]}")
        print(("<表头>数据 删除"," 表头<数据>删除",
               " 表头 数据<删除>")[g3])
        fla3=m()
        if fla3=="\x00":
            mid=m()
            if mid=="H":g=2
            elif mid=="K" and g3>0:g3-=1
            elif mid=="M" and g3<2:g3+=1
        elif fla3=="\r":
            gk=0
            while g3==0:#表头
                os.system("cls")
                print("Esc 退出 Del 删除")
                ke,da=q[g2][1],q[g2][2]
                lke=len(ke)
                for i in range(lke):
                    if i==gk:
                        print('<',ke[i],'>')
                    else:
                        print(ke[i])
                print("+")
                fla5=m()
                if fla5=='\x1b':
                    break
                if fla5=="\x00":
                    mid=m()
                    if mid=="H" and gk>0:gk-=1
                    elif mid=="P" and gk<lke:gk+=1
                    elif mid=="S":
                        ke.pop(gk)
                        gk=0
                        for i2 in range(len(da)):
                            da[i2].pop(int(gk))
                if gk==lke:
                    ke.append(input('添加:'))
                    for i in range(len(da)):
                        da[i].append('*')
                if "a"<=fla5<="z":
                    print(fla5,end='')
                    fla5+=input()
                    ke[gk]=fla5
                q[g2][1],q[g2][2]=ke,da
            x,y=0,0
            while g3==1:#数据
                """控制位置"""
                ke,da=q[g2][1],q[g2][2]
                if y<0:
                    x,y=x-1,len(ke)-1
                if y>=len(ke):
                    x,y=x+1,0
                if x<0:
                    x=0
                if x>len(da)-1:
                    x=len(da)-1
                """格式化输出"""
                os.system("cls")
                print("Esc 退出 /新行并修改 *新行 - 删除行 . 跳转")
                print(f'Pg:{x//10:<2}|',end='')
                for k in range(len(ke)):
                    print(f'({k}){ke[k]:7}',end='')
                print(end='\n')
                for x2 in range(x-x%10,min(x-x%10+10,len(da))):
                    print(f'{str(x2):>5}|',end='')
                    for y2 in range(len(ke)):
                        if (x2,y2)==(x,y):
                            print(f'[{da[x2][y2]:8}]',end='')
                        else:
                            print(f'{da[x2][y2]:10}',end='')
                    print(end='\n')
                print(f'[{x}-{y}][{da[x][y]}]')
                """控制表格"""
                fla5=m()
                if fla5=='\x1b':
                    break
                elif fla5=="\x00":
                    mid=m()
                    if mid=='H':x-=1
                    elif mid=='P':x+=1
                    elif mid=='K':y-=1
                    elif mid=='M':y+=1
                    elif mid=='I':x-=10
                    elif mid=='Q':x+=10
                elif fla5=='.':
                    i=input('x,y:')
                    if len(i.split(','))==2:
                        i=i.split(',')
                    elif len(i.split(' '))==2:
                        i=i.split(' ')
                    elif len(i.split('.'))==2:
                        i=i.split('.')
                    else:
                        input('输入出错!')
                        continue
                    x,y=map(int,i)
                elif 'a'<=fla5<='z':
                    print(fla5,end='')
                    fla5+=input()
                    da[x][y]=fla5
                    y+=1
                elif fla5=='=':
                    da[x][y]=input('=')
                elif fla5=='+':
                    da[x][y]+=input('=')
                elif fla5 in('/','*'):
                    x,y=len(da),0
                    da.append(['*']*len(ke))
                    if fla5=='/':
                        for y2 in range(len(ke)):
                            c2=input(f'{x}-{y2}=')
                            if c2=='':
                                continue
                            da[x][y2]=c2
                elif fla5=='-' and x!=0:
                    da.pop(x)
                    x-=1
                q[g2][2]=da
            if g3==2 and len(q)>1:#删除
                q.pop(g2)
                g,g2=2,0